#ifndef TIEC_FILE_H
#define TIEC_FILE_H

#include "macro.h"
#include "data.h"

namespace NS_TIEC {
  /// 文件实现
  class File {
  public:
    File(const String& path);

    /// 判断文件是否存在
    /// \return 文件存在则返回true
    bool isExists();

    /// 取文件大小
    /// \return 文件字节长度
    UInt64 size();

    /// 取文件名
    /// \return 完整的文件名
    String getName();

    /// 取文件名宽字符
    /// \return 完整的文件名
    WString getWName();

    /// 取文件扩展名
    /// \return 扩展名
    String getExtension();

    /// 取文件扩展名宽字符
    /// \return 扩展名
    WString getWExtension();

    /// 获取文件最后一次更新的毫秒时间戳
    /// \return 更新时间
    UInt64 lastUpdateTime();

    /// 创建目录
    /// \return 只能创建单级目录，不支持多级
    bool mkdir();

    /// 创建目录
    /// \return 支持多级目录
    bool mkdirs();

    /// 取父目录
    /// \return 父目录文件
    File getParentFile();

    /// 通过相对路径获得文件
    /// \param relative_path 相对路径
    File relativeFile(const String& relative_path);

    /// 通过相对路径获得文件
    /// \param relative_path 相对路径
    File relativeFile(const WString& relative_path);

    /// 获取文件路径
    /// \return 如果文件传入的是相对路径，那返回的是相对路径
    String getPath();

    /// 获取文件路径宽字符
    /// \return 如果文件传入的是相对路径，那返回的是相对路径
    WString getWPath();

    /// 获取文件绝对路径
    /// \return 绝对路径
    String getAbsolutePath();

    /// 获取文件绝对路径宽字符
    /// \return 绝对路径
    WString getWAbsolutePath();

    /// 重命名文件
    /// \param new_file 新的文件
    /// \return 重命名成功返回true
    bool renameTo(const File& new_file);

    /// 读取文件内容为字符串
    /// \return 文件字符串内容
    String readString();

    /// 读取文件内容为宽字符串
    /// \return 文件字符串内容
    WString readWString();

    /// 读取文件内容为字节集
    /// \return 文件字节
    ByteArray readBytes();

    /// 向文件写入内容
    /// \param text 字符串内容
    bool writeString(const String& text);

    /// 向文件写入宽字符内容
    /// \param text 字符串内容
    bool writeWString(const WString& text);

    /// 向文件写入字节集
    /// \param bytes 字节集内容
    bool writeBytes(const ByteArray& bytes);

    /// 转换为Uri
    Uri toUri();
  private:
    String path_;
  };
}

#endif //TIEC_FILE_H
